\documentclass{article}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[spanish,activeacute]{babel}
%%\usepackage[latin1]{inputenc}
%%\usepackage{mathtools}
%%\usepackage{graphicx}
\author{Santiago Boselli\and Santiago Piccinini\and Gabriel Andr\'es Sanca}
\title{66.20 Organizaci\'on de Computadoras\\
Trabajo pr\'actico 0: Infraestructura b\'asica}
\date{10 de Septiembre del 2013}
\begin{document}
\maketitle

\section{ Objetivos }
Familiarizarse con las herramientas de software que usaremos en los siguientes trabajos, implementando un programa (y su correspondiente documentaci\'on) que resuelva el problema piloto que presentaremos m\'as abajo.
\section{ Recursos }
Usaremos el programa GXemul para simular el entorno de desarrollo que utilizaremos en este y otros trabajos pr\'acticos, una m\'aquina MIPS corriendo una versi\'on reciente del sistema operativo NetBSD.
\section{ Implementaci\'on }
\subsection{ Programa }
El programa, a escribir en lenguaje C, es una versi\'on del comando \tt rev \normalfont de UNIX. El mismo concatena y escribe en stdout el contenido de uno o mas archivos, invirtiendo el orden de los caracteres de cada l\'inea. En nuestro caso, se asume que cada caracter mide 1 byte.
Retorna 0 s\'olo en caso de \'exito. Todos los errores deben ser impresos por stderr.
\subsubsection{ Comando \tt rev }
El comando \tt rev \normalfont es un comando que sirve para cambiar el orden del texto de un archivo. Lo que hace es invertir cada l\'inea de dicho texto.
\tt
\begin{tabbing}
         --- \= -- \= \kill
         NAME\\
         \> \> rev -- reverse lines of a file or files\\
\end{tabbing}

\begin{tabbing}
         --- \= -- \= \kill
         SYNOPSIS\\
         \> \> rev [-V] [-h] [file ...]\\
\end{tabbing}

\begin{tabbing}
         --- \= -- \= ---------------\= \kill
         DESCRIPTION\\
         \> \> The rev utility copies the specified files to 	   standard output,\\ \> \> reversing the order of characters in every line.  If no files\\\> \> are specified, standard input is read.\\ \\
         \> \> -V, --version\\
         \> \> \> Output version information and exit.\\
         \> \> -h, --help\\
         \> \> \> Output help and exit.\\
\end{tabbing}           
\normalfont
\subsubsection{ Par\'ametros }
El programa debe recibir como par\'ametros los archivos sobre los que va a trabajar. En caso de no recibir ning\'un par\'ametro, entonces deber\'a operar sobre los datos provenientes de stdin. Debido a que el tama\~no de la informaci\'on a recibir es desconocida, debe utilizarse memoria din\'amica. Cualquier error debe ser informado debidamente.

\subsection{ Portabilidad }
Como es usual, es necesario que la implementaci\'on desarrollada provea un grado m\'inimo de portabilidad. Para satisfacer esto, el programa deber\'a funcionar al menos en NetBSD/pmax (usando el simulador GXemul) y la versi\'on de Linux.
\section{ Dise\~no e implementaci\'on }

- Memoria din\'amica\\
- Buffer global ---> de tama\~no variable, distinto que el tama\~no del archivo, y siempre crece, hasta que alcanza la dimension de la mayor linea.\\
- Inversion linea a linea\\
- Impresion linea a linea\\

\section{ Comando(s) para compilar el programa }

Generamos un Makefile para compilar el archivo.

\tt
\begin{verbatim}
TARGET = tp0
CC = gcc
CFLAGS = -O0 -Wall  -pedantic
INCLUDES = .

main:
	$(CC) $(CFLAGS) -I$(INCLUDES) $(TARGET).c -o $(TARGET)

asm:
	$(CC) $(CFLAGS) -I$(INCLUDES) $(TARGET).c -S -o $(TARGET).S

test:
	$(CC) $(CFLAGS) -g -I$(INCLUDES) $(TARGET).c -o $(TARGET)
	sh tests.sh

clean:
	rm -f $(TARGET).S $(TARGET)

\end{verbatim}
\normalfont

Completar
\section{ Corridas de prueba }

Corrida del Makefile\\
\tt
gcc -O0 -Wall  -pedantic -g -I. tp0.c -o tp0
sh tests.sh

\begin{tabbing}
         --- \= -- \= ---------------\= \kill
Running tests:\\
    \> \> Inversion de archivo vacio...pass\\
	\> \> Inversion de archivo solo con fines de linea...pass\\
	\> \> Inversion de archivo con 2 lineas...pass\\
	\> \> Inversion de su propio codigo...pass\\
	\> \> Inversion de su propio codigo usando stdin...pass\\
	\> \> Inversion de 3 archivos con 2 lineas...pass\\
\end{tabbing}

\normalfont Archivo Makefile:
\tt
\begin{verbatim}
ECHO='printf'
PASS="${ECHO} pass\n"
FAIL="${ECHO} fail\n"

TMP_FILE='test_data/tmp'

$ECHO '\nRunning tests:\n'

$ECHO '\tInversion de archivo vacio...'
./tp0 test_data/empty | cmp -s - test_data/empty && $PASS || $FAIL;

$ECHO '\tInversion de archivo solo con fines de linea...'
./tp0 test_data/eols | cmp -s - test_data/eols && $PASS || $FAIL;

$ECHO '\tInversion de archivo con 2 lineas...'
./tp0 test_data/file1 | rev | cmp -s - test_data/file1 && $PASS || $FAIL;

$ECHO '\tInversion de su propio codigo...'
./tp0 tp0.c | rev | cmp -s - tp0.c && $PASS || $FAIL;

$ECHO '\tInversion de su propio codigo usando stdin...'
rev tp0.c | ./tp0 | cmp -s - tp0.c && $PASS || $FAIL;


$ECHO '\tInversion de 3 archivos con 2 lineas...'
ARGS='test_data/file1 test_data/file2 test_data/file1'
./tp0 $ARGS > $TMP_FILE && rev $ARGS | cmp $TMP_FILE - && $PASS || $FAIL;
\end{verbatim}
\normalfont
Completar
\section{ C\'odigo fuente }
Completar
\section{ C\'odigo MIPS32 }
Completar
\end{document}
